import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import multer from 'multer';

// 获取当前文件的目录路径
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 确保目录存在
const ensureDirectoryExists = (directory) => {
  if (!fs.existsSync(directory)) {
    fs.mkdirSync(directory, { recursive: true });
  }
};

// 配置存储
const configureStorage = (folder) => {
  // 确保上传目录存在
  const uploadDir = path.join(__dirname, `../../public/uploads/${folder}`);
  ensureDirectoryExists(uploadDir);

  return multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, uploadDir);
    },
    filename: (req, file, cb) => {
      // 生成唯一文件名
      const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
      const extension = path.extname(file.originalname);
      cb(null, `${folder}-${uniqueSuffix}${extension}`);
    }
  });
};

// 图片上传配置
export const imageUpload = multer({
  storage: configureStorage('images'),
  limits: { fileSize: 5 * 1024 * 1024 }, // 5MB限制
  fileFilter: (req, file, cb) => {
    // 验证文件类型
    if (file.mimetype.startsWith('image/')) {
      cb(null, true);
    } else {
      cb(new Error('仅支持图片文件上传!'), false);
    }
  }
});

// 视频上传配置
export const videoUpload = multer({
  storage: configureStorage('videos'),
  limits: { fileSize: 50 * 1024 * 1024 }, // 50MB限制
  fileFilter: (req, file, cb) => {
    // 验证文件类型
    if (file.mimetype.startsWith('video/')) {
      cb(null, true);
    } else {
      cb(new Error('仅支持视频文件上传!'), false);
    }
  }
});

// 头像上传配置
export const avatarUpload = multer({
  storage: configureStorage('avatars'),
  limits: { fileSize: 2 * 1024 * 1024 }, // 2MB限制
  fileFilter: (req, file, cb) => {
    // 验证文件类型
    if (file.mimetype.startsWith('image/')) {
      cb(null, true);
    } else {
      cb(new Error('仅支持图片文件作为头像!'), false);
    }
  }
});

/**
 * 上传图片
 * @route POST /api/upload/image
 * @param {object} req - 包含上传文件的请求
 * @returns {object} 上传结果
 */
export const uploadImage = (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({
        success: false,
        message: '没有上传文件'
      });
    }

    // 返回文件路径
    const filePath = `/uploads/images/${req.file.filename}`;

    return res.status(201).json({
      success: true,
      message: '图片上传成功',
      filePath
    });
  } catch (error) {
    console.error('图片上传失败:', error);
    return res.status(500).json({
      success: false,
      message: '图片上传失败'
    });
  }
};

/**
 * 上传视频
 * @route POST /api/upload/video
 * @param {object} req - 包含上传文件的请求
 * @returns {object} 上传结果
 */
export const uploadVideo = (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({
        success: false,
        message: '没有上传文件'
      });
    }

    // 返回文件路径
    const filePath = `/uploads/videos/${req.file.filename}`;

    return res.status(201).json({
      success: true,
      message: '视频上传成功',
      filePath
    });
  } catch (error) {
    console.error('视频上传失败:', error);
    return res.status(500).json({
      success: false,
      message: '视频上传失败'
    });
  }
};

/**
 * 上传头像
 * @route POST /api/upload/avatar
 * @param {object} req - 包含上传文件的请求
 * @returns {object} 上传结果
 */
export const uploadAvatarFile = (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({
        success: false,
        message: '没有上传文件'
      });
    }

    // 返回文件路径
    const filePath = `/uploads/avatars/${req.file.filename}`;

    return res.status(201).json({
      success: true,
      message: '头像上传成功',
      filePath
    });
  } catch (error) {
    console.error('头像上传失败:', error);
    return res.status(500).json({
      success: false,
      message: '头像上传失败'
    });
  }
};